home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c++-part2 / 10691 < prev    next >
Encoding:
Text File  |  1996-08-05  |  6.2 KB  |  316 lines

  1. Path: news.tu-harburg.de!usenet
  2. From: Juri Jurkewitsch <Jurkewitsch@tu-harburg.d400.de>
  3. Newsgroups: comp.lang.c++,comp.cad.autocad
  4. Subject: A small program to test MSVC++4.0 compiler
  5. Date: 9 Mar 1996 14:05:45 GMT
  6. Organization: TU Hamburg-Harburg
  7. Message-ID: <4hs37p$k8q@rztsun.tu-harburg.de>
  8. NNTP-Posting-Host: os2.ft2.tu-harburg.de
  9. Mime-Version: 1.0
  10. Content-Type: text/plain; charset=us-ascii
  11. Content-Transfer-Encoding: 7bit
  12. X-Mailer: Mozilla 1.1N (Windows; I; 16bit)
  13.  
  14. /*
  15.    Hello to all who would help me or just will read it!
  16.  
  17.    I need to buy now MSVC++ to create application for AutoCAD R13.
  18.    I would know which version of it can understand my program.
  19.  
  20.    There is a small sample that was correct compiled
  21.    and executed under BC++4.5. It contains nested class
  22.    definitions, both templates of class and function,
  23.    class definitions inside the function, some MACROS.
  24.  
  25.    I tryed MSVC++1.5 for this example and got a lot of error messages. 
  26.  
  27.    If you have MSVC++ later as 2.0, could you compile it and
  28.    report results to me via e-mail? 
  29.  
  30.    Thanks in advice.
  31.  
  32.    Yuri Yurkewitsch
  33. */
  34.  
  35. typedef int Boolean;
  36.  
  37. template <class T> class Value
  38. {
  39.     T * Data;
  40.     int Size;
  41.     public:
  42.  
  43.      Value(int size) { Size = size; Data = new T[size]; }
  44.     ~Value() {delete[] Data;}
  45.  
  46.       T& operator = ( const T& n ) { Data[0] = n; return (T&)n; }
  47.           operator T&() const {return Data[0];}
  48.       T& operator[](int i) const {return Data[i];}
  49. };
  50.  
  51. class BasePredicate
  52. {
  53.       const char *  Name;
  54.       int           Offset;
  55.       int           Size;
  56.  
  57.   protected:
  58.                  BasePredicate( const char * name,
  59.                  unsigned int offset, unsigned int size)
  60.                  {
  61.                     Name   = name;
  62.                     Offset = offset;
  63.                     Size = size;
  64.                  }
  65. };
  66.  
  67. template <class T> class Predicate : public BasePredicate
  68. {
  69.         protected:
  70.         Value <T> TheValue;
  71.  
  72.         public:
  73.               Predicate (const char * name, T & value,
  74.                 unsigned int offset, unsigned int size)
  75.               : BasePredicate( name, offset, size ),
  76.                  TheValue( value )
  77.               {
  78.               }
  79.  
  80.             operator Value <T> () const { return TheValue; }
  81.             Value <T> operator = ( T value ) { return 
  82. TheValue = value; }
  83. };
  84.  
  85. #define AP_PHANTOM( class, member )((class*)0L)->member
  86. #define AP_SIZEOF( class, member )sizeof( AP_PHANTOM( class, member))
  87. #define AP_OFFSET( class, member )(unsigned int)(char 
  88. *)&AP_PHANTOM(class,member)
  89.  
  90.  
  91. #define AP_PREDICATE( type, member ) \
  92.     static class P##member : public Predicate<##type##> \
  93.     {        \
  94.       public:\
  95.           P##member( const char * commentar) \
  96.           : Predicate<##type##> ( \
  97.                 (const char*) #member, \
  98.                 AP_PHANTOM( Object, member), \
  99.                 AP_OFFSET( Object, member), \
  100.                 AP_SIZEOF( Object, member)) \
  101.             { \
  102.             } \
  103.         type& operator = ( const type & n ) { return 
  104. TheValue.operator = ( n); } \
  105.         operator type&() const { return TheValue.operator type& 
  106. () ;} \
  107.                 \
  108.               \
  109.             \
  110.     } member
  111.  
  112.  
  113. class BaseRule
  114. {
  115.   protected:
  116.  
  117.           BaseRule ( const char * name)
  118.           {
  119.           }
  120.  
  121.   public:
  122.  
  123.           virtual Boolean _fire () = 0;
  124. };
  125.  
  126. template <class A>  class Rule1 : public BaseRule
  127. {
  128.             A & TheA;
  129.  
  130.             public:
  131.  
  132.          Rule1<A>( const char * name, A & arg)
  133.          : BaseRule( name ), TheA( arg)
  134.          {
  135.      }
  136.  
  137.          Boolean  fire( A & arg );
  138.          virtual Boolean  _fire () { return fire( TheA ); }
  139. };
  140.  
  141. template <class A>  static Rule1<A>*
  142.         DeclareRule ( const char * name, A & arg1)
  143. {
  144.       return new Rule1<A>( name, arg1);
  145. }
  146. /***************************************************************/
  147. template <class A, class B>  class Rule2 : public BaseRule
  148. {
  149.          A & TheA;
  150.     const B & TheB;
  151.  
  152.          public:
  153.  
  154.             Rule2<A,B>(const char * name, A & arg1, const B & 
  155. arg2)
  156.             : BaseRule( name ), TheA( arg1), TheB( arg2)
  157.                         {
  158.             }
  159.  
  160.             Boolean  fire( A & arg1, const B & arg2 );
  161.             virtual Boolean  _fire () 
  162. { return fire( TheA, TheB ); }
  163. };
  164.  
  165.  
  166. template <class A, class B>  Rule2<A,B>*
  167.         DeclareRule ( const char * name, A & arg1, B & arg2)
  168. {
  169.       return new Rule2<A,B>( name, arg1, arg2);
  170. }
  171. /***************************************************************/
  172. template <class A, class B, class C>  class Rule3 : public BaseRule
  173. {
  174.             A & TheA;
  175.   const  B & TheB;
  176.   const  C & TheC;
  177.  
  178.             public:
  179.  
  180.             Rule3<A,B,C>(const char * name, 
  181.                                  A & arg1, 
  182.                                  const B & arg2, const C & arg3)
  183.             : BaseRule( name ), 
  184.                         TheA( arg1), TheB( arg2), TheC( arg3)
  185.                         {
  186.                         }
  187.  
  188.             Boolean  fire( A & arg1, const B & arg2,
  189.                                  const C & arg3 );
  190.             virtual Boolean  _fire () 
  191.                           { return fire( TheA, TheB, TheC ); }
  192. };
  193.  
  194.  
  195. template <class A, class B, class C>  Rule3<A,B,C>*
  196.         DeclareRule ( const char * name, 
  197.             A & arg1, const B & arg2, const C & arg3 )
  198. {
  199.       return new Rule3<A,B,C>( name, arg1, arg2, arg3);
  200. }
  201. /***************************************************************/
  202.  
  203.  
  204. class Test
  205. {
  206.     class Class;
  207.  
  208.     public:
  209.  
  210.     class Object
  211.     {
  212.         friend class Class;
  213.      public:
  214.         int N;
  215.         int M;
  216.     };
  217.  
  218.     class Predicate1
  219.     {
  220.     };
  221.  
  222.     class Predicate2
  223.     {
  224.     };
  225.  
  226.     static class Class
  227.     {
  228.         public:
  229.  
  230.         AP_PREDICATE( int , N );
  231.         AP_PREDICATE( int , M );
  232.  
  233.         BaseRule * r;
  234.  
  235.         Class()
  236.         {
  237.           r = DeclareRule( "a Rule", N, M);
  238.         }
  239.     } TheClass;
  240.  
  241. };
  242.  
  243.  
  244. Test::Class::PN Test::Class::N("Name");
  245. Test::Class::PM Test::Class::M("Mass");
  246.  
  247. Boolean Rule2<Test::Class::PN,Test::Class::PM>::fire(
  248.             Test::Class::PN & N,
  249.         const Test::Class::PM & M)
  250. {
  251.     int X = M;
  252.     N = M;
  253.  
  254.     return 0;
  255. }
  256.  
  257. Boolean Rule1<int>::fire( int & arg1 )
  258. {
  259.     return (arg1 > 3);
  260. }
  261.  
  262. Boolean Rule2<Test::Predicate1,Test::Predicate2>::fire( 
  263.                   Test::Predicate1 & p1,
  264.                   const Test::Predicate2 & p2)
  265. {
  266.     return 0;
  267. }
  268.  
  269. Boolean Rule2<int,float>::fire( int & arg1, const float & arg2)
  270. {
  271.     arg1 = 3 * (int) arg2;
  272.     return 1;
  273. }
  274.  
  275. Boolean Rule3<int,Test::Predicate1,Test::Predicate2>::fire(
  276.      int & arg1,
  277.      const Test::Predicate1 & arg2,
  278.      const Test::Predicate2 & arg3)
  279. {
  280.     return 0;
  281. }
  282.  
  283.  
  284.  
  285. void rules()
  286. {
  287.   int X;
  288.   float Y;
  289.   Test::Predicate1 P1;
  290.   Test::Predicate2 P2;
  291.  
  292.   BaseRule * r0 = DeclareRule( "R0", P1 , P2 );
  293.   BaseRule * r1 = DeclareRule( "R1", X );
  294.   BaseRule * r2 = DeclareRule( "R2", X , Y );
  295.   BaseRule * r3 = DeclareRule( "R3", X , P1, P2 );
  296.  
  297.   r0->_fire();
  298.   r1->_fire();
  299.   r2->_fire();
  300.   r3->_fire();
  301. }
  302.  
  303. Test::Class Test::TheClass;
  304.  
  305. int main ()
  306. {
  307.   rules();
  308.  
  309.   Test::TheClass.r->_fire();
  310.  
  311.   return 0;
  312. }
  313.  
  314.  
  315.  
  316.